package main

import (
	"fmt"
	"reflect"
)

type Stu struct {
	Name string
	Age  int
}

func (s Stu) Run() {
	fmt.Println("run")
}
func (s Stu) Say(word1, word2 string) {
	fmt.Println("say", word1, word2)
}

func main() {
	value := reflect.ValueOf(Stu{
		Name: "tom",
		Age:  20,
	})

	methodValue := value.MethodByName("Run")
	fmt.Printf("Value的类型是：%v，Value的Type实例%v\n", methodValue.Kind(), methodValue.Type()) //Value的类型是：func，Value的Type实例func()
	//无参数的函数在调用时，传入nil或者空切片
	methodValue.Call(nil)                      //run
	methodValue.Call(make([]reflect.Value, 0)) //run

	methodValue2 := value.MethodByName("Say1")
	if methodValue2.Kind() != reflect.Func {
		return
	}
	fmt.Println(methodValue2)
	fmt.Printf("Value的类型是：%v，Value的Type实例%v\n", methodValue2.Kind(), methodValue2.Type()) //Value的类型是：func，Value的Type实例func(string, string)
	//有参数的需要以切片的形式传入。切片元素的类型为reflect.Value
	//methodValue2.Call([]reflect.Value{
	//	reflect.ValueOf("你好"),
	//	reflect.ValueOf("世界"),
	//}) //say 你好 世界

}
